#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：pytest_allure_pytest-html_study 
@File    ：06_allure_特性.py
@IDE     ：PyCharm 
@Author  ：XiaoDengYa
@Date    ：2021/6/3/003 15:20 
"""

"""
Allure报告结构
Overview：总览
Categories：类别，默认是分了failed和error，凡是执行结果是其中一个的都会被归到类里面，可以通过这里快捷查看哪些用例是failed和error的
Suites：测试套件，就是所有用例的层级关系，可以根据package、module、类、方法来查找用例
Graphs：测试结果图形化，包括用例执行结果的分布图，优先级，耗时等
Timeline：可以看到测试用例精确的测试时序（执行顺序），包括执行时间
Behaviors：行为驱动，根据epic、feature、story来分组测试用例（后面会讲到）
Packages：这就是按照package、module来分组测试用例了
"""

# 如何添加Environment呢
"""
通过创建environment.properties或者environment.xml文件，并把文件存放到allure-results(这个目录是生成最后的html报告之前，生成依赖文件的目录)目录下，就是 --alluredir  后面跟的目录
像我这里目录就是allure，所以放在allure下面 --alluredir allure 
"""
# environment.properties 填写数据
"""
Browser=Chrome
Browser.Version=81.0.4044.92
Stand=Production
ApiUrl=127.0.0.1/login
python.Version=3.7.2
"""

# environment.xml(不能写中文)
"""
<environment>
    <parameter>
        <key>Browser</key>
        <value>Chrome</value>
    </parameter>
    <parameter>
        <key>Browser.Version</key>
        <value>81.0.4044.92</value>
    </parameter>
    <parameter>
        <key>Stand</key>
        <value>Production</value>
    </parameter>
        <parameter>
        <key>ApiUrl</key>
        <value>127.0.0.1/login</value>
    </parameter>
        <parameter>
        <key>python.Version</key>
        <value>3.7.2</value>
    </parameter>
</environment>

"""


"""
Categories
直译：分类

通俗理解：测试用例结果的分类
默认情况下，有两类缺陷：
Product defects 产品缺陷（测试结果：failed）
Test defects 测试缺陷（测试结果：error/broken）
我们是可以创建自定义缺陷分类的，将 categories.json 文件添加到allure-results目录即可（和上面environment.properties放同一个目录）

categories.json
[
  {
    "name": "Ignored tests", 
    "matchedStatuses": ["skipped"] 
  },
  {
    "name": "Infrastructure problems",
    "matchedStatuses": ["broken", "failed"],
    "messageRegex": ".*bye-bye.*" 
  },
  {
    "name": "Outdated tests",
    "matchedStatuses": ["broken"],
    "traceRegex": ".*FileNotFoundException.*" 
  },
  {
    "name": "Product defects",
    "matchedStatuses": ["failed"]
  },
  {
    "name": "Test defects",
    "matchedStatuses": ["broken"]
  }
]

讲下参数的含义
name：分类名称
matchedStatuses：测试用例的运行状态，默认["failed", "broken", "passed", "skipped", "unknown"]
messageRegex：测试用例运行的错误信息，默认是 .* ，是通过正则去匹配的哦！
traceRegex：测试用例运行的错误堆栈信息，默认是  .*  ，也是通过正则去匹配的哦！
注意
这里的name是可以写中文的哦！
"""

"""
Flaky test
用法：在类或者方法上直接加 @Flaky 

官方也说了：可以将整个测试类标记为Flaky
那什么是Flaky呢？
简单来说就是，不够稳定的测试用例集，有可能前阵子还运行成功，过阵子就运行失败，理解成“闪烁”
标记成Flaky的好处就是：当用例失败的情况下，我们能获取足够详细的信息，毕竟有可能某些测试用例是非常重要的
如果不标记为Flaky的话，可能就要禁用这些测试
"""

"""
@allure.step 
allure报告最重要的一点是，它允许对每个测试用例进行非常详细的步骤说明
通过 @allure.step() 装饰器，可以让测试用例在allure报告中显示更详细的测试过程
"""

# 生成测试报告：allure generate report/ -o report/html

import allure

"""
@allure.step("第一步")
def passing_step():
    pass


@allure.step("第二步")
def step_with_nested_steps():
    nested_step()


@allure.step("第三步")
def nested_step():
    nested_step_with_arguments(1, 'abc')


@allure.step("第四步{0}，{arg2}")
def nested_step_with_arguments(arg1, arg2):
    pass


@allure.step("第五步")
def test_with_nested_steps():
    passing_step()
    step_with_nested_steps()
"""

"""
allure.attach（挺有用的）
作用：allure报告还支持显示许多不同类型的附件，可以补充测试结果；自己想输出啥就输出啥，挺好的

语法： allure.attach(body, name, attachment_type, extension) 

参数列表
body：要显示的内容（附件）
name：附件名字
attachment_type：附件类型，是 allure.attachment_type 里面的其中一种
extension：附件的扩展名（比较少用）
"""


"""
@allure.description()
作用
可以添加足够详细的测试用例描述，以便于管理层查看哦哈哈哈

语法格式，有三种
@allure.description(str）
在测试用例函数声明下方添加 """ """
@allure.description_html(str）：相当于传一个HTML代码组成的字符串，类似 allure.attach() 中传HTML
"""


import allure
'''
# 方式一
@allure.description("""
这是一个@allure.description装饰器
没有特别的用处
""")
def test_description_from_decorator():
    assert 42 == int(6 * 7)

# 方式二
def test_unicode_in_docstring_description():
    """
    当然，在方法声明的下一行这样子写，也算一种添加description的方式哦
    """
    assert 42 == int(6 * 7)

# 方式三
@allure.description_html("""
<h1>Test with some complicated html description</h1>
<table style="width:100%">
  <tr>
    <th>Firstname</th>
    <th>Lastname</th>
  </tr>
  <tr align="center">
    <td>William</td>
    <td>Smith</td>
</table>
""")
def test_html_description():
    assert True
'''

"""
@allure.title()
作用
使得测试用例的标题更具有可读性，毕竟我们可以写成中文
支持占位符传递关键字参数哦（动态标题，结合 @pytest.mark.parametrize 使用）
"""
"""
import pytest, allure


@allure.title("前置操作：登录")
@pytest.fixture
def test_loginss(request):
    params = request.param
    name = params["username"]
    pwd = params["pwd"]
    allure.attach(f"这是测试用例传的参数{params}")
    print(name, pwd, params)
    yield name, pwd


@allure.title("成功登录，测试数据是：{test_loginss}")
@pytest.mark.parametrize("test_loginss", [
    {"username": "name1", "pwd": "pwd1"},
    {"username": "name2", "pwd": "pwd2"}], indirect=True)
def test_success_login(test_loginss):
    name, pwd = test_loginss
    allure.attach(f"账号{name},密码{pwd}")

@allure.title("多个参数{name},{phone},{age}")
@pytest.mark.parametrize("name,phone,age", [
    (1, 2, 3),
    (4, 5, 6),
    (7, 8, 9)
])
def test_test_test(name, phone, age):
    print(name, phone, age)

"""

# import allure
#
# TEST_CASE_LINK = 'https://github.com/qameta/allure-integrations/issues/8#issuecomment-268313637'
#
#
# @allure.link('https://www.youtube.com/watch?v=4YYzUTYZRMU')
# def test_with_link():
#     pass
#
#
# @allure.link('https://www.youtube.com/watch?v=Su5p2TqZxKU', name='点击我看一看youtube吧')
# def test_with_named_link():
#     pass
#
#
# @allure.issue('140', 'bug issue链接')
# def test_with_issue_link():
#     pass
#
#
# @allure.testcase(TEST_CASE_LINK, '测试用例地址')
# def test_with_testcase_link():
#     pass

"""
总结
为了减少程序的阅读复杂性，其实可以统一用@allure.link()
传name，写好链接描述，就知道这个链接是干嘛的啦，反正三个装饰器的作用都是一样的，就是样式略微不同.....
"""

